package com.term.service;

import com.term.dao.IBaseDao;
import com.term.domain.BaseDomain;
import com.term.domain.utils.DomainPage;
import com.term.domain.common.ConditionSet;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * Created by chenGang on 2017/1/12.
 * service层公共的一些接口实现
 */
public interface IBaseService<T extends BaseDomain> {

    /**
     * 添加记录
     * @param t
     * @return
     */
    Optional<T> add(T t);

    /**
     * 根据id查找记录
     * @param clazz
     * @param id
     * @return
     */
    Optional<T> getEntityById(Class<T> clazz, long id);

    /**
     * 查询对象的所有记录
     * @param clazz
     * @return
     */
    List<T> getAllEntities(Class<T> clazz);

    /**
     * 查询未被逻辑删除的所有记录
     * @param clazz
     * @return
     */
    List<T> getAllEntitiesWithoutDel(Class<T> clazz);

    /**
     * 根据条件查询所有记录
     *
     * @param clazz
     * @param fields
     * @return
     */
    List<T> getAllEntities(Class<T> clazz, Map<String, Object> fields);

    /**
     * 根据条件查询并且未被逻辑删除的所有记录
     *
     * @param clazz
     * @param fields
     * @return
     */
    List<T> getAllEntitiesWithoutDel(Class<T> clazz, Map<String, Object> fields);

    /**
     * 根据对象的某个字段查询一条记录
     *
     * @param clazz
     * @param fieldName
     * @param fieldValue
     * @return
     */
    Optional<T> getEntityByField(Class<T> clazz, String fieldName, Object fieldValue);

    /**
     * 根据对象的某个字段查询未被逻辑删除的一条记录
     *
     * @param clazz
     * @param fieldName
     * @param fieldValue
     * @return
     */
    Optional<T> getEntityByFieldWithoutDel(Class<T> clazz, String fieldName, Object fieldValue);

    /**
     * 根据对象的某个字段查询满足条件的所有记录
     *
     * @param clazz
     * @param fieldName
     * @param fieldValue
     * @return
     */
    List<T> getEntitiesByField(Class<T> clazz, String fieldName, Object fieldValue);

    /**
     * 根据对象的某个字段查询满足条件并且未被逻辑删除的所有记录
     *
     * @param clazz
     * @param fieldName
     * @param fieldValue
     * @return
     */
    List<T> getEntitiesByFieldWithoutDel(Class<T> clazz, String fieldName, Object fieldValue);

    /**
     * 根据多个参数确定返回满足条件的所有记录
     *
     * @param clazz
     * @param map
     * @return
     */
    List<T> getEntitiesByFieldList(Class<T> clazz, Map<String, Object> map);

    /**
     * 根据多个参数确定返回满足条件并且未被逻辑删除的所有记录
     *
     * @param clazz
     * @param map
     * @return
     */
    List<T> getEntitiesByFieldListWithoutDel(Class<T> clazz, Map<String, Object> map);

    /**
     * 分页查询记录，可以支持模糊查询
     *
     * @param clazz
     * @param map
     * @param orderBy
     * @param sortBy
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> queryEntitiesPagesByFieldList(Class<T> clazz, Map<String, Object> map, String orderBy, IBaseDao.SortBy sortBy, int pageIndex, int pageSize);

    /**
     * 分页查询未被逻辑删除的记录，可以支持模糊查询
     * @param clazz
     * @param map
     * @param orderBy
     * @param sortBy
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> queryEntitiesPagesByFieldListWithoutDel(Class<T> clazz, Map<String, Object> map, String orderBy, IBaseDao.SortBy sortBy, int pageIndex, int pageSize);

    /**
     * 分页查询按着id降序排列的记录
     *
     * @param clazz
     * @param map
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesPagesByFieldList(Class<T> clazz, Map<String, Object> map, int pageIndex, int pageSize);

    /**
     * 分页查询按着id降序排列并且未被逻辑删除的记录
     *
     * @param clazz
     * @param map
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesPagesByFieldListWithoutDel(Class<T> clazz, Map<String, Object> map, int pageIndex, int pageSize);

    /**
     * 分页查询记录
     *
     * @param clazz
     * @param map
     * @param orderBy
     * @param sortBy
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesPagesByFieldList(Class<T> clazz, Map<String, Object> map, String orderBy, IBaseDao.SortBy sortBy, int pageIndex, int pageSize);

    /**
     * 分页查询未被逻辑删除的记录
     *
     * @param clazz
     * @param map
     * @param orderBy
     * @param sortBy
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesPagesByFieldListWithoutDel(Class<T> clazz, Map<String, Object> map, String orderBy, IBaseDao.SortBy sortBy, int pageIndex, int pageSize);

    /**
     * 不带条件的分页查询
     *
     * @param clazz
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesByPage(Class<T> clazz, int pageIndex, int pageSize);

    /**
     * 不带条件并且未被逻辑删除的分页查询
     *
     * @param clazz
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesByPageWithoutDel(Class<T> clazz, int pageIndex, int pageSize);

    /**
     * 逻辑删除(就是把isDeleted置为T)
     *
     * @param t
     */
     Optional<T> delete(T t);

    /**
     * 更新记录
     *
     * @param var1
     * @return
     */
    Optional<T> update(T var1);

    /**
     * 分页模糊查询
     *
     * @param clazz
     * @param conditionSet
     * @param orderBy
     * @param sortBy
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesByConditions(Class<T> clazz, ConditionSet conditionSet, String orderBy, IBaseDao.SortBy sortBy, int pageIndex, int pageSize);

    /**
     * 分页模糊查询未被逻辑删除的记录
     *
     * @param clazz
     * @param conditionSet
     * @param orderBy
     * @param sortBy
     * @param pageIndex
     * @param pageSize
     * @return
     */
    DomainPage<T> getEntitiesByConditionsWithoutDel(Class<T> clazz, ConditionSet conditionSet, String orderBy, IBaseDao.SortBy sortBy, int pageIndex, int pageSize);

    /**
     * 根据条件查询
     *
     * @param clazz
     * @param conditionSet
     * @param orderBy
     * @param sortBy
     * @return
     */
    List<T> getEntitiesByConditions(Class<T> clazz, ConditionSet conditionSet, String orderBy, IBaseDao.SortBy sortBy);

    /**
     * 根据条件查询未被逻辑删除的记录
     *
     * @param clazz
     * @param conditionSet
     * @param orderBy
     * @param sortBy
     * @return
     */
    List<T> getEntitiesByConditionsWithoutDel(Class<T> clazz, ConditionSet conditionSet, String orderBy, IBaseDao.SortBy sortBy);

    /**
     * 根据多个条件确定一条记录
     *
     * @param clazz
     * @param conditionSet
     * @return
     */
    Optional<T> getEntityByConditions(Class<T> clazz, ConditionSet conditionSet);

}
